\section{SQL简介} % (fold)
\label{sec:sql简介}
SQL是一组特殊的单词，专门用于同数据库交互。所有的主流数据库都会使用SQL，MySQL也不例外。SQL非常容易学习和使用，但要精通SQL语句，则需要深入的学习和实践。

\subsection{创建数据库和表} % (fold)
\label{sub:创建数据库和表}
使用SQL创建数据库的语法如下：

\begin{lstlisting}
CREATE DATABASE databasename
\end{lstlisting}

SQL不区分大小写。不过建议大写SQL关键字，就像前面的示例语法那样。这样做有助于把SQL名词与数据库、表和列名区分开。

CREATE名词也用于建立表。语法如下：

\begin{lstlisting}
CREATE TABLE tablename (column1name description,column2name description...)
\end{lstlisting}

在MySQL客户端内，必须用分号终止每一条SQL命令，尽管严格说来这些分号不是SQL自身的一部分。如果同时在phpMyAdmin内执行多个查询，也应该用分号隔开它们。如果只在phpMyAdmin内运行一个查询，就不需要分号。

SHOW命令可用于呈现数据库中的表，或者表中的列名称和类型。语法如下：

\begin{lstlisting}
SHOW TABLES;
SHOW COLUMNS FROM tablename;
\end{lstlisting}

SHOW命令的等价命令为DESCRIBE。

\subsection{插入记录} % (fold)
\label{sub:插入记录}
在创建数据库和表之后，使用INSERT命令插入记录，语法如下：

\begin{lstlisting}
INSERT INTO tablename (column1, column2…) VALUES (value1, value2 …)
INSERT INTO tablename (column4, column8) VALUES (valueX, valueY)
\end{lstlisting}

使用这种结构，可以添加多行记录。
\begin{myremark}{SQL中的引号与反引号}
  在SQL命令中，数值不能用引号括住，字符串、日期时间必须用引号括住，单词NULL不能用引号括住。如果在值中需要使用引号，可以使用反斜线进行转义。

  偶尔会在SQL命令中看到使用反引号（`）。这个字符与波浪符（～）是同一个键，它与单引号不同。反引号用来安全地引用可能与已存在的MySQL关键词重复的表名或列名。
\end{myremark}

INSERT中一个有意思的变化是REPLACE。REPLACE语句的作用是，如果使用的表的主键或唯一索引的值已经存在，那么REPLACE会更新存在的行；如果不存重复则会同INSERT一样插入新行。

\subsection{选择数据} % (fold)
\label{sub:选择数据}
SELECT查询使用以下语法返回与某一条件匹配的记录行：

\begin{lstlisting}
SELECT which_columns FROM which_table
\end{lstlisting}

最简单的SELECT查询是：

\begin{lstlisting}
SELECT * FROM tablename
\end{lstlisting}

星号意味着你想查看每一列。另外，还可以指定要返回的列，并用逗号把这些列相互隔开。

\begin{lstlisting}
SELECT column1, column3 FROM tablename
\end{lstlisting}

明确要选择哪些列有几个好处。第一个好处是性能，没有理由获取将不会使用的列。第二个好处是顺序，可以用一种不同于它们在表中布局的顺序返回列。第三个好处是，指定列允许你利用函数操纵那些列中的值。

\subsection{使用条件语句} % (fold)
\label{sub:使用条件语句}
可以通过向SELECT查询中添加WHERE名词来实现限制查询条件。语法如下：

\begin{lstlisting}
SELECT which_columns FROM which_table WHERE condition(s)
\end{lstlisting}

可以结合使用各种运算符以及圆括号来创建更复杂的表达式，例如：

\begin{lstlisting}
SELECT * FROM items WHERE (price BETWEEN 10.00 AND 20.00) AND (quantity > 0)
SELECT * FROM cities WHERE (zip_code = 90210) OR (zip_code = 90211)
\end{lstlisting}

可以使用数学加法（+）、减法（–）、乘法（*）和除法（/）运算符在查询内执行数学计算。

\subsection{排序查询结果} % (fold)
\label{sub:排序查询结果}

为了以一种有意义的方式对它们进行排序，可以使用ORDER BY子句。例如：

\begin{lstlisting}
SELECT * FROM tablename ORDER BY column
\end{lstlisting}

还可以指定排序方式，默认为升序（ASC），若要降序，则使用DESC，例如：

\begin{lstlisting}
SELECT * FROM tablenameORDER BY column1, column2 DESC
\end{lstlisting}

\subsection{限制查询结果} % (fold)
\label{sub:限制查询结果}
在SE-LECT查询中，WHERE指示返回哪些记录，ORDER BY决定如何对这些记录进行排序，但是LIMIT用于指定要返回多少条记录。其用法如下：

\begin{lstlisting}
SELECT * FROM tablename LIMIT x
\end{lstlisting}

上面的查询将会返回前x条记录。还可以指定开始位置，如下：

\begin{lstlisting}
SELECT * FROM tablename LIMIT x，y
\end{lstlisting}

上面的语句将返回从x条记录开始的y条记录。

LIMIT子句不会改进查询的执行速度，因为MySQL仍然必须把每一条记录集合到一起，然后截短列表。但在mysql客户或PHP脚本中，LIMIT子句将把要处理的数据量减至最少。

\subsection{更新数据} % (fold)
\label{sub:更新数据}
当表中的数据需要更新时，可以使用如下语句：

\begin{lstlisting}
UPDATE tablename SET column=value WHERE column5=value
\end{lstlisting}

更新（以及删除）是使用主键的最重要的原因之一。无论何时使用UPDATE，都要使用WHERE条件语句，除非你希望更改会影响每一行。

\subsection{删除数据} % (fold)
\label{sub:删除数据}
彻底从数据库中删除记录。要执行该操作，可以使用DELETE命令。语法如下：

\begin{lstlisting}
DELETE FROM tablename WHERE condition
\end{lstlisting}

使用DROP命令删除数据库和表，如：

\begin{lstlisting}
DROP DATABASE databasename
DROP TABLE tablename
\end{lstlisting}

\subsection{MySQL函数} % (fold)
\label{sub:mysql函数}

